﻿using Puerts;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public delegate string DelegateFunc5();
public delegate GameObject DelegateFunc6();
public class JsEnvExample4 : MonoBehaviour
{
    private JsEnv jsEnv;
    // Start is called before the first frame update
    void Start()
    {
        jsEnv = new JsEnv(new DefaultLoader(UnityEngine.Application.dataPath + "/../TsProject/output"),8282);
        // Eval调用需要结合JS语法，详细参见Javascript文档
        jsEnv.Eval("const m = require('example4/ScriptExample4')");
        // JS虚拟机的运行按照顺序执行，m=require 它属于当前虚拟机内全局设置
        // 没有返回值的直接Action即可，m.func1等同于将m模块中的func1抛出
        var func1 = jsEnv.Eval<Action>("m.func1");
        func1?.Invoke();

        var func2 = jsEnv.Eval<Action<string>>("m.func2");
        func2?.Invoke("C# call you");

        var func3 = jsEnv.Eval<Action<GameObject>>("m.func3");
        func3?.Invoke(GameObject.Find("Cube"));

        var func4 = jsEnv.Eval<Action<MonoBehaviour>>("m.func4");
        func4?.Invoke(this);
        // 带有返回值的需要使用委托
        var func5 = jsEnv.Eval<DelegateFunc5>("m.func5");
        var str = func5?.Invoke();
        Debug.Log("return str = " + str);

        // 带有返回值的需要使用委托
        var func6 = jsEnv.Eval<DelegateFunc6>("m.func6");
        var obj = func6?.Invoke();
        Debug.Log("return obj = ", obj);
    }
    public Action action1 = null;
    // Update is called once per frame
    void Update()
    {
        // func4 使用的
        action1?.Invoke();
        jsEnv.Tick();
    }
    private void OnDestroy()
    {
        jsEnv.Dispose();
    }
}
